home *** CD-ROM | disk | FTP | other *** search
- package java.beans;
-
- import java.io.IOException;
- import java.io.OutputStream;
- import java.lang.reflect.Array;
- import java.lang.reflect.Field;
- import java.nio.charset.Charset;
- import java.nio.charset.CharsetEncoder;
- import java.util.IdentityHashMap;
- import java.util.Map;
- import java.util.Vector;
-
- public class XMLEncoder extends Encoder {
- private static String encoding = "UTF-8";
- private OutputStream out;
- private Object owner;
- private int indentation = 0;
- private boolean internal = false;
- private Map valueToExpression;
- private Map targetToStatementList;
- private boolean preambleWritten = false;
- private NameGenerator nameGenerator;
-
- public XMLEncoder(OutputStream var1) {
- this.out = var1;
- this.valueToExpression = new IdentityHashMap();
- this.targetToStatementList = new IdentityHashMap();
- this.nameGenerator = new NameGenerator();
- }
-
- public void setOwner(Object var1) {
- this.owner = var1;
- this.writeExpression(new Expression(this, "getOwner", new Object[0]));
- }
-
- public Object getOwner() {
- return this.owner;
- }
-
- public void writeObject(Object var1) {
- if (this.internal) {
- super.writeObject(var1);
- } else {
- this.writeStatement(new Statement(this, "writeObject", new Object[]{var1}));
- }
-
- }
-
- private Vector statementList(Object var1) {
- Vector var2 = (Vector)this.targetToStatementList.get(var1);
- if (var2 != null) {
- return var2;
- } else {
- var2 = new Vector();
- this.targetToStatementList.put(var1, var2);
- return var2;
- }
- }
-
- private void mark(Object var1, boolean var2) {
- if (var1 != null && var1 != this) {
- ValueData var3 = this.getValueData(var1);
- Expression var4 = var3.exp;
- if (var1.getClass() != String.class || var4 != null) {
- if (var2) {
- ++var3.refs;
- }
-
- if (!var3.marked) {
- var3.marked = true;
- Object var5 = var4.getTarget();
- if (!(var5 instanceof Class)) {
- this.statementList(var5).add(var4);
- ++var3.refs;
- }
-
- this.mark(var4);
- }
- }
- }
- }
-
- private void mark(Statement var1) {
- Object[] var2 = var1.getArguments();
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- Object var4 = var2[var3];
- this.mark(var4, true);
- }
-
- this.mark(var1.getTarget(), false);
- }
-
- public void writeStatement(Statement var1) {
- boolean var2 = this.internal;
- this.internal = true;
-
- try {
- super.writeStatement(var1);
- this.mark(var1);
- this.statementList(var1.getTarget()).add(var1);
- } catch (Exception var4) {
- this.getExceptionListener().exceptionThrown(new Exception("XMLEncoder: discarding statement " + var1, var4));
- }
-
- this.internal = var2;
- }
-
- public void writeExpression(Expression var1) {
- boolean var2 = this.internal;
- this.internal = true;
- Object var3 = this.getValue(var1);
- if (this.get(var3) == null || var3 instanceof String && !var2) {
- this.getValueData(var3).exp = var1;
- super.writeExpression(var1);
- }
-
- this.internal = var2;
- }
-
- public void flush() {
- if (!this.preambleWritten) {
- this.writeln("<?xml version=" + this.quote("1.0") + " encoding=" + this.quote(encoding) + "?>");
- this.writeln("<java version=" + this.quote(System.getProperty("java.version")) + " class=" + this.quote(XMLDecoder.class.getName()) + ">");
- this.preambleWritten = true;
- }
-
- ++this.indentation;
- Vector var1 = this.statementList(this);
-
- for(int var2 = 0; var2 < var1.size(); ++var2) {
- Statement var3 = (Statement)var1.get(var2);
- if ("writeObject".equals(var3.getMethodName())) {
- this.outputValue(var3.getArguments()[0], this, true);
- } else {
- this.outputStatement(var3, this, false);
- }
- }
-
- --this.indentation;
-
- try {
- this.out.flush();
- } catch (IOException var4) {
- this.getExceptionListener().exceptionThrown(var4);
- }
-
- this.clear();
- }
-
- void clear() {
- super.clear();
- this.nameGenerator.clear();
- this.valueToExpression.clear();
- this.targetToStatementList.clear();
- }
-
- public void close() {
- this.flush();
- this.writeln("</java>");
-
- try {
- this.out.close();
- } catch (IOException var2) {
- this.getExceptionListener().exceptionThrown(var2);
- }
-
- }
-
- private String quote(String var1) {
- return "\"" + var1 + "\"";
- }
-
- private ValueData getValueData(Object var1) {
- ValueData var2 = (ValueData)this.valueToExpression.get(var1);
- if (var2 == null) {
- var2 = new ValueData(this, (1)null);
- this.valueToExpression.put(var1, var2);
- }
-
- return var2;
- }
-
- private static boolean isValidCharCode(int var0) {
- return 32 <= var0 && var0 <= 55295 || 10 == var0 || 9 == var0 || 13 == var0 || 57344 <= var0 && var0 <= 65533 || 65536 <= var0 && var0 <= 1114111;
- }
-
- private void writeln(String var1) {
- try {
- for(int var2 = 0; var2 < this.indentation; ++var2) {
- this.out.write(32);
- }
-
- this.out.write(var1.getBytes(encoding));
- this.out.write(" \n".getBytes(encoding));
- } catch (IOException var3) {
- this.getExceptionListener().exceptionThrown(var3);
- }
-
- }
-
- private void outputValue(Object var1, Object var2, boolean var3) {
- if (var1 == null) {
- this.writeln("<null/>");
- } else if (var1 instanceof Class) {
- this.writeln("<class>" + ((Class)var1).getName() + "</class>");
- } else {
- ValueData var4 = this.getValueData(var1);
- if (var4.exp != null) {
- Object var5 = var4.exp.getTarget();
- String var6 = var4.exp.getMethodName();
- if (var5 == null || var6 == null) {
- throw new NullPointerException((var5 == null ? "target" : "methodName") + " should not be null");
- }
-
- if (var5 instanceof Field && var6.equals("get")) {
- Field var10 = (Field)var5;
- this.writeln("<object class=" + this.quote(var10.getDeclaringClass().getName()) + " field=" + this.quote(var10.getName()) + "/>");
- return;
- }
-
- Class var7 = ReflectionUtils.primitiveTypeFor(var1.getClass());
- if (var7 != null && var5 == var1.getClass() && var6.equals("new")) {
- String var8 = var7.getName();
- if (var7 == Character.TYPE) {
- char var9 = (Character)var1;
- if (!isValidCharCode(var9)) {
- this.writeln(createString(var9));
- return;
- }
-
- var1 = quoteCharCode(var9);
- if (var1 == null) {
- var1 = var9;
- }
- }
-
- this.writeln("<" + var8 + ">" + var1 + "</" + var8 + ">");
- return;
- }
- } else if (var1 instanceof String) {
- this.writeln(this.createString((String)var1));
- return;
- }
-
- if (var4.name != null) {
- this.writeln("<object idref=" + this.quote(var4.name) + "/>");
- } else {
- this.outputStatement(var4.exp, var2, var3);
- }
- }
- }
-
- private static String quoteCharCode(int var0) {
- switch (var0) {
- case 13:
- return "
";
- case 34:
- return """;
- case 38:
- return "&";
- case 39:
- return "'";
- case 60:
- return "<";
- case 62:
- return ">";
- default:
- return null;
- }
- }
-
- private static String createString(int var0) {
- return "<char code=\"#" + Integer.toString(var0, 16) + "\"/>";
- }
-
- private String createString(String var1) {
- CharsetEncoder var2 = Charset.forName(encoding).newEncoder();
- StringBuilder var3 = new StringBuilder();
- var3.append("<string>");
- int var4 = 0;
-
- while(var4 < var1.length()) {
- int var5 = var1.codePointAt(var4);
- int var6 = Character.charCount(var5);
- if (isValidCharCode(var5) && var2.canEncode(var1.substring(var4, var4 + var6))) {
- String var7 = quoteCharCode(var5);
- if (var7 != null) {
- var3.append(var7);
- } else {
- var3.appendCodePoint(var5);
- }
-
- var4 += var6;
- } else {
- var3.append(createString(var1.charAt(var4)));
- ++var4;
- }
- }
-
- var3.append("</string>");
- return var3.toString();
- }
-
- private void outputStatement(Statement var1, Object var2, boolean var3) {
- Object var4 = var1.getTarget();
- String var5 = var1.getMethodName();
- if (var4 != null && var5 != null) {
- Object[] var6 = var1.getArguments();
- boolean var7 = var1.getClass() == Expression.class;
- Object var8 = var7 ? this.getValue((Expression)var1) : null;
- String var9 = var7 && var3 ? "object" : "void";
- String var10 = "";
- ValueData var11 = this.getValueData(var8);
- if (var7 && var11.refs > 1) {
- String var12 = this.nameGenerator.instanceName(var8);
- var11.name = var12;
- var10 = var10 + " id=" + this.quote(var12);
- }
-
- if (var4 != var2) {
- if (var4 == Array.class && var5.equals("newInstance")) {
- var9 = "array";
- var10 = var10 + " class=" + this.quote(((Class)var6[0]).getName());
- var10 = var10 + " length=" + this.quote(var6[1].toString());
- var6 = new Object[0];
- } else {
- if (var4.getClass() != Class.class) {
- var11.refs = 2;
- this.outputValue(var4, var2, false);
- this.outputValue(var8, var2, false);
- return;
- }
-
- var10 = var10 + " class=" + this.quote(((Class)var4).getName());
- }
- }
-
- if ((var7 || !var5.equals("set") || var6.length != 2 || !(var6[0] instanceof Integer)) && (!var7 || !var5.equals("get") || var6.length != 1 || !(var6[0] instanceof Integer))) {
- if ((var7 || !var5.startsWith("set") || var6.length != 1) && (!var7 || !var5.startsWith("get") || var6.length != 0)) {
- if (!var5.equals("new") && !var5.equals("newInstance")) {
- var10 = var10 + " method=" + this.quote(var5);
- }
- } else {
- var10 = var10 + " property=" + this.quote(Introspector.decapitalize(var5.substring(3)));
- }
- } else {
- var10 = var10 + " index=" + this.quote(var6[0].toString());
- var6 = var6.length == 1 ? new Object[0] : new Object[]{var6[1]};
- }
-
- Vector var16 = this.statementList(var8);
- if (var6.length == 0 && var16.size() == 0) {
- this.writeln("<" + var9 + var10 + "/>");
- } else {
- this.writeln("<" + var9 + var10 + ">");
- ++this.indentation;
-
- for(int var13 = 0; var13 < var6.length; ++var13) {
- this.outputValue(var6[var13], (Object)null, true);
- }
-
- for(int var17 = 0; var17 < var16.size(); ++var17) {
- Statement var14 = (Statement)var16.get(var17);
- this.outputStatement(var14, var8, false);
- }
-
- --this.indentation;
- this.writeln("</" + var9 + ">");
- }
- } else {
- throw new NullPointerException((var4 == null ? "target" : "methodName") + " should not be null");
- }
- }
- }
-